﻿// 605 [CF 609E] Minimum spanning tree for each edge.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
http://oj.daimayuan.top/course/22/problem/981

给定一张 n
 个顶点 m
 条边的带权无向简单图，顶点编号从 1
 到 n
，对于每一条边请求出包含这条边的生成树的最小边权和。

输入格式
第一行两个数 n,m
，表示顶点数和边数。

接下来 m
 行，每行三个整数 u,v,w
，表示 u
 号点和 v
 号点之间有一条边权为 w
 的边。

输出格式
输出共 m
 行，第 i
 行一个整数表示包含第 i
 条边的生成树的最小边权和。

样例输入
5 7
1 2 3
1 3 1
1 4 5
2 3 2
2 5 3
3 4 2
4 5 4
样例输出
9
8
11
8
8
8
9
数据规模
对于 100%
 的数据，保证 1≤n≤2×105,n−1≤m≤2×105,1≤u,v≤n,1≤w≤109
，数据保证图连通。
*/

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <memory.h>
using namespace std;

struct Node {
	int x, y, v, idx;
	bool operator <(const Node& A)const {
		return v < A.v;
	}
}a[200010];

int n, m, dist[200010], f[200010][21], v[200010][21], fa[200010];
long long q[200010];

struct Edge {
	int y, v;
	Edge(int _y, int _v) {
		y = _y; v = _v;
	}
};
vector<Edge> edge[200010];


int gf(int i) {
	if (i == fa[i])
		return i;
	return fa[i] = gf(fa[i]);
}


void dfs(int x) {
	for(auto i:edge[x])
		if (!dist[i.y]) {
			dist[i.y] = dist[x] + 1;
			f[i.y][0] = x;
			v[i.y][0] = i.v;
			dfs(i.y);
		}
}


int main() {
	//cin >> n >> m;
	scanf("%d%d",&n,&m);
	for (int i = 1; i <= m; i++) {
		//cin >> a[i].x >> a[i].y >> a[i].v;
		scanf("%d%d%d", &a[i].x , &a[i].y , &a[i].v);
		a[i].idx = i;
	}
	sort(a + 1, a + m + 1);
	for (int i = 1; i <= n; i++)
		fa[i] = i;
	long long res = 0;
	for (int i = 1; i <= m; i++) {
		int x = gf(a[i].x), y = gf(a[i].y);
		if (x != y) {
			res += a[i].v;
			edge[a[i].x].push_back(Edge(a[i].y, a[i].v));
			edge[a[i].y].push_back(Edge(a[i].x, a[i].v));
			fa[x] = y;
		}
	}
	memset(dist, 0, sizeof dist);
	dist[1] = 1;
	dfs(1);

	for (int i = 1; i <= 20; i++) {
		for (int j = 1; j <= n; j++) {
			f[j][i] = f[f[j][i - 1]][i - 1];
			v[j][i] = max(v[j][i - 1], v[f[j][i - 1]][i - 1]);
		}
	}

	for (int i = 1; i <= m; i++) {
		int x = a[i].x, y = a[i].y;
		if (dist[x] < dist[y])
			swap(x, y);
		int z = dist[x] - dist[y];
		int ans = 0;
		for (int i = 0; z; z /= 2, ++i) {
			if (z & 1) {
				ans = max(ans, v[x][i]);
				x = f[x][i];
			}
		}

		if (x != y) {
			for (int i = 20; i >= 0; i--) {
				if (f[x][i] != f[y][i]) {
					ans = max(ans, v[x][i]);
					ans = max(ans, v[y][i]);
					x = f[x][i];
					y = f[y][i];
				}
			}
			ans = max(ans, v[x][0]);
			ans = max(ans, v[y][0]);
		}
		q[a[i].idx] = res - ans + a[i].v;
	}


	for (int i = 1; i <= m; i++) {
		//cout << q[i] << endl;
		printf("%lld\n",q[i]);
	}


	 
	return 0;
}